<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      function* task() {
        const d = yield 1;
        console.log(d);
        const a = yield "abc";
        console.log(a);
        const resp = yield fetch("https://cnodejs.org/api/v1/topics");
        const result = yield resp.json();
        console.log(result);
      }

      run(task);

      function run(generatorFunc) {
        const generator = generatorFunc();
        let result = generator.next(); // 启动任务（开始迭代）
        handleResult();
        // 对result进行处理
        function handleResult() {
          if (result.done) {
            return; // 迭代完成，不处理
          }
          // 迭代没有完成，分为两种情况
          if (typeof result.value.then === "function") {
            // 1. 迭代的数据是一个Promise
            // 等待Promise完成后，再进形下一次迭代
            result.value.then(
              (data) => {
                result = generator.next(data);
                handleResult();
              },
              (err) => console.log(err)
            );
          } else {
            // 2. 迭代的实际是其他数据
            result = generator.next(result.value);
            handleResult();
          }
        }
      }
    </script>
  </body>
</html>
